fix(desktop): keep transcript lifecycle registry-owned - #3711
Conversation
Keep a transcript consumer registered after delivery failures and request a reset instead of silently detaching it. This preserves the Registry as the sole lifecycle authority across Host replacement and removes the Observer's duplicate renderer-destruction listener. Generated-by: Codex
a1da22e to
52adc4e
Compare
Astro-Han
left a comment
There was a problem hiding this comment.
I reviewed this head and found no blocking issues. No P0-P2.
Checks on 52adc4e are test: success.
简体中文
该头未发现阻断问题。
M4n5ter
left a comment
There was a problem hiding this comment.
I reviewed exact head 52adc4e70c2ae9020d98a822d1233cf37bf9c715 and found no P0-P3 issues.
The change keeps the renderer's logical transcript registration in RuntimeHostSessionObservationRegistry while treating send, acknowledgement-timeout, and delivery-capacity failures as recoverable Observer work. Renderer destruction, explicit close, Host replacement, and Registry shutdown still own the terminal cleanup paths; an initial open failure remains terminal on both layers, so the change does not leave split lifecycle state.
I verified the focused Observer, execution IPC, and Desktop manager suites (81 tests total), the Desktop main TypeScript build, Biome on both changed files, the ASF header audit, and the clean current-main merge tree. The exact-head hosted test check is terminal-success.
简体中文
我审查了精确提交 52adc4e70c2ae9020d98a822d1233cf37bf9c715,未发现 P0-P3 问题。
本变更在发送失败、确认超时或投递容量不足时保留 RuntimeHostSessionObservationRegistry 中的渲染器逻辑 transcript 注册,只把这些情况作为 Observer 的可恢复工作失败处理。渲染器销毁、显式关闭、Host 替换和 Registry 关闭仍负责终止清理;首次打开失败在两层仍然都是终止状态,因此不会留下分裂的生命周期状态。
我验证了 Observer、执行 IPC 与 Desktop manager 的相关测试(共 81 项)、Desktop main TypeScript 构建、两个变更文件的 Biome、ASF header 审计,以及与当前 main 的无冲突合并树。精确提交上的托管 test 检查已终态成功。
Summary
RuntimeHostSessionObservationRegistryas the sole transcript lifecycle authority and remove the Observer duplicate renderer-destruction listenerThe production diff is
+4 / -11. The earlier Renderer close/reopen retry has been removed; this repair adds no retry protocol, recovery state, or second consumer identity.Root cause
RuntimeHostSessionObservertreated delivery work failure as consumer termination and removed the physical consumer from its indexes.RuntimeHostSessionObservationRegistrystill retained the renderer logical registration because it owns continuity across Runtime Host replacement. Every later range request therefore passed the Registry and failed in the Observer withDesktop transcript consumer does not exist.The diagnostic report cannot distinguish whether the original detach was triggered by a send failure, acknowledgement timeout, or delivery-capacity protection. All three entered the same silent-detach path.
Architecture
The lifecycle is now one-way:
This removes the conflicting Observer termination authority. Explicit close, renderer destruction, and Registry shutdown still release the consumer and idle Session normally.
Verification
Desktop transcript consumer does not existnode --test apps/desktop/dist/main/__tests__/runtime-host-session-observer.test.js apps/desktop/dist/main/__tests__/desktop-transcript-range-store.test.js— 51 passednpm --workspace @maka/desktop run typechecknpx biome check apps/desktop/src/main/runtime-host-session-observer.ts apps/desktop/src/main/__tests__/runtime-host-session-observer.test.tsnpm run check:asf-headersThe previous CI failure was inherited from five missing ASF headers on the old base. #3708 fixed that baseline failure; this branch is rebased onto current green
mainand the new exact-head CI is running.AI use
Select exactly one:
Tool(s) and scope: Codex diagnosed the lifecycle mismatch, performed the simplification audit, authored the Observer repair and regression coverage, and ran the focused automated and real-window verification. The commit includes the required
Generated-by: Codextrailer.Checklist
Does this PR entail a change in behavior?